import axios from 'axios'
import { message } from 'antd'
// 在js文件中使用redux的数据（不是组件，所以不能使用useSelector()这个钩子去获取）
import store from '@/store'
import { logout } from '@/store/actions/user'
// 第三方模块histrory 参考地址：https://www.cnblogs.com/yuanjili666/p/13740385.html
import { createHashHistory } from 'history'
const history = createHashHistory()
export const baseURL = 'http://geek.itheima.net/v1_0/'
// 创建 axios实例
const instance = axios.create({
  baseURL,
  timeout: 5000,
})

// 添加请求拦截器
instance.interceptors.request.use(
  (config) => {
    // 获取token
    const {
      user: { token },
    } = store.getState()
    // 如果有token，就往请求头中携带token
    if (token) {
      config.headers.Authorization = `Bearer ${token}`
    }
    return config
  },
  (error) => {
    // 对请求错误做些什么
    return Promise.reject(error)
  }
)

// 添加响应拦截器
instance.interceptors.response.use(
  (res) => res.data,
  (err) => {
    // 对响应错误做点什么
    // 如果请求接口网络超时，也需要做处理，err 中没有response
    if (!err.response) {
      // 暂时这样处理，这样 每个请求都会提示
      message.error('网络繁忙，请稍后重试')
      return Promise.reject('网络繁忙，请稍后重试')
    }
    // 400错误(客户端的问题)
    if (err.response.status && err.response.status === 400) {
      // 错误提示
      message.error(err.response.data.message)
      // 返回异常的Promise信息
      return Promise.reject(new Error(err.response.data.message))
    }
    // 401错误（未授权:token过期或者token无效或者没有携带token）
    if (err.response.status && err.response.status === 401) {
      // 错误提示
      message.warning('token无效')
      // 清除缓存
      store.dispatch(logout())
      // 不会刷新页面
      history.push('/login')
      // 使用原生的dom跳转(刷新页面)
      // window.location.href = '#/login'
    }
    return Promise.reject(err)
  }
)

// 导出请求函数
export const http = (url, method, submitData) => {
  return instance({
    method,
    url,
    [method.toUpperCase() === 'GET' ? 'params' : 'data']: submitData,
  })
}
